home *** CD-ROM | disk | FTP | other *** search
/ AMIGA-CD 2 / Amiga-CD - Volume 2.iso / ungepackte_daten / 1993 / 4 / 02 / semaphoren / init.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-01  |  2.2 KB  |  81 lines

  1. /* Dieses Programm läuft erst ab OS 2.0.
  2.  * Aus Platzgründen mußte diese Überprüfung
  3.  * entfallen. Auch die, ob das Programm »Second«
  4.  * läuft. Es demonstriert lediglich die Verwendung
  5.  * von öffentlichen Semaphoren.
  6.  * Autor: Rainer Zeitler
  7.  */
  8. #include <exec/types.h>
  9. #include <exec/ports.h>
  10. #include <exec/memory.h>
  11. #include <exec/semaphores.h>
  12. #include <dos/dostags.h>
  13.  
  14. char *SemName="mysema"; /* So heißt die Semaphore */
  15. struct SignalSemaphore *mysema;
  16.  
  17. /* Diese Variable ist geschützt */
  18. ULONG SemaphoreTest=0;
  19.  
  20. struct MyMessage {
  21.   struct Message msg;
  22.   struct MsgPort *ReplyPort;
  23.   ULONG *change;
  24. } MsgSend, *MsgReceived;
  25.  
  26. struct TagItem memtags[] = { SYS_Output, 0,
  27.   SYS_Input, 0, SYS_Asynch, TRUE, TAG_DONE };
  28.  
  29. BOOL AddPubSemaphore() {
  30.   if( !FindSemaphore(SemName)) {
  31.     mysema=AllocMem(sizeof(struct SignalSemaphore),
  32.                     MEMF_CLEAR|MEMF_PUBLIC);
  33.     if( mysema ) {
  34.       mysema->ss_Link.ln_Pri=0;
  35.       mysema->ss_Link.ln_Name=SemName;
  36.       AddSemaphore( mysema ); return TRUE;
  37.     } else return FALSE;
  38.   } else return FALSE;
  39. }
  40.  
  41. BOOL StartSecond() {
  42.   BOOL ret=FALSE;
  43.   if( !System("run >nil: <nil: second",&memtags[0]))
  44.     ret=TRUE;
  45.   return ret;
  46. }
  47.  
  48. main() {
  49.   struct MsgPort *SemPort =
  50.                      CreatePort("Test-Semaphore",0);
  51.   if( SemPort ) {
  52.     if( AddPubSemaphore() ) {
  53.       if( StartSecond() ) {
  54.         WaitPort( SemPort );
  55.         MsgReceived=GetMsg( SemPort );
  56.         MsgSend.msg.mn_Length=
  57.                            sizeof(struct MyMessage);
  58.         MsgSend.msg.mn_Node.ln_Type=NT_MESSAGE;
  59.         MsgSend.msg.mn_ReplyPort=NULL;
  60.         MsgSend.change=&SemaphoreTest;
  61.         PutMsg( MsgReceived->ReplyPort,&MsgSend );
  62.         /* Signal von Second, Semaphore ist belegt*/
  63.         WaitPort( SemPort );
  64.         while( AttemptSemaphore(mysema) == 0 ) {
  65.           printf("Semaphore belegt. Kein Zugriff ");
  66.           printf("auf die Variable möglich\n");
  67.           Delay(4); }
  68.         printf("Neuer Wert: %d\n",SemaphoreTest);
  69.       }
  70.       Forbid();
  71.       RemSemaphore(mysema);
  72.       ObtainSemaphore(mysema);
  73.       ReleaseSemaphore(mysema);
  74.       FreeMem( mysema,
  75.                     sizeof(struct SignalSemaphore));
  76.       Permit();
  77.     }
  78.     DeletePort( SemPort );
  79.   }
  80. }
  81.